var util =
	{
		logBox: 
			{
				create: function(name)
					{
						return new Ext.form.Checkbox
							({
								fieldLabel: 'Registrar',
								name: 'data['+(name||_PHP_.model)+'][log]'
							});
					},
				enable: function(obj)
					{
						if(obj && obj.rendered)
						{
							obj.setValue(false);
							obj.setDisabled(false);
						}
					},
				disable: function(obj)
					{
						if(obj && obj.rendered)
						{
							obj.setDisabled(true);
						}
					}
				
			},
		avisoFieldset: function(parent)
			{
				return new Ext.form.FieldSet
					({
						title: 'Atenção',
						html: 'Este registro é uma referencia. Para editar os arquivos relacionados ao mesmo, é necessário editar o registro para o qual este <i>aponta</i>. Para isso, clique <a href="#" onclick="Ext.getCmp(this.parentNode.parentNode.parentNode.id).openParent()">aqui</a>',
						hidden: true,
						parent: parent,
						listeners:
							{
								'render': function()
									{
										this.setHeight(70);
									}
							},
						openParent: function()
							{
								if(this.parent != undefined)
								{
									this.parent.formWin.hide();
									this.parent.doEdit(this.referencia_id);
								}
							}
					});
			},
		grid:
			{
				duplicateButton: function(grid, idx)
					{
						grid.getTopToolbar().insertButton(idx, new Ext.Toolbar.Separator());
						grid.getTopToolbar().insertButton
							(
								idx+1, 
								{
				   					xtype: 'tbbutton',
									text: 'Espelhar',
				   					icon: _PHP_.url.incroot+'img/admin/ext/application_double.png',
							        cls: 'x-btn-text-icon',
				   					handler: function()
				   						{
				   							if(grid.getSelectionModel().getCount() < 1)
							        		{
							        			Ext.MessageBox.alert('Atenção', 'Por favor selecione o registro o qual deseja espelhar.');
							        		}
							        		else
							        		{
							        			if(grid.getSelectionModel().getCount() > 1)
							        			{
							        				Ext.MessageBox.alert('Atenção', 'Por favor selecione apenas um registro.');
							        			}
							        			else
							        			{
													if(!Ext.isEmpty(grid.getSelectionModel().getSelected().data['referencia_id']))
													{
														Ext.MessageBox.alert('Atenção', 'Não possivel espelhar este registro porque trata-se de uma referência.');
													}
													else
													{
														var msgbox = Ext.MessageBox.wait('Espelhando registro ...', 'Aguarde');
														
														Ext.Ajax.request
															({
																url: _PHP_.url.copy + grid.getSelectionModel().getSelected().id,
																method: 'post',
																callback: function(options, success, response)
																	{
																		msgbox.hide();
																		
																		var response = Ext.util.JSON.decode(response.responseText); 
																		if(response.success === 'true')
																		{
																			grid.getStore().reload();
																			
																		}
																		else
																		{
																			msgbox.alert('Erro', response.erro);
																		}
																	}
															});
													}
												}
											} 	
				   						}
				   				}
							);
					},
				linkButton: function(grid, idx, callback)
					{
						grid.getTopToolbar().insertButton(idx, new Ext.Toolbar.Separator());
						grid.getTopToolbar().insertButton
							(
								idx+1, 
								{
				   					xtype: 'tbbutton',
									text: 'Link',
				   					icon: _PHP_.url.incroot+'img/admin/ext/application_link.png',
							        cls: 'x-btn-text-icon',
				   					handler: function()
				   						{
				   							if(grid.getSelectionModel().getCount() < 1)
							        		{
							        			Ext.MessageBox.alert('Atenção', 'Por favor selecione o registro o qual deseja linkar.');
							        		}
							        		else
							        		{
							        			if(grid.getSelectionModel().getCount() > 1)
							        			{
							        				Ext.MessageBox.alert('Atenção', 'Por favor selecione apenas um registro.');
							        			}
							        			else
							        			{
													Ext.MessageBox.wait('Redirecionando ...', 'Aguarde');
													window.location.href = _PHP_.url.link + grid.getSelectionModel().getSelected().id + (typeof callback === 'function' ? callback() : '');
							        			}
							        		}
				   						}
				   				}
							);
					}
			},
		view:
			{
				duplicateButton: function(view, idx)
					{
						view.getTopToolbar().insertButton(idx, new Ext.Toolbar.Separator());
						view.getTopToolbar().insertButton
							(
								idx+1, 
								{
				   					xtype: 'tbbutton',
									text: 'Espelhar',
				   					icon: _PHP_.url.incroot+'img/admin/ext/application_double.png',
							        cls: 'x-btn-text-icon',
				   					handler: function()
				   						{
				   							if(view.parent.getSelectionCount() < 1)
							        		{
							        			Ext.MessageBox.alert('Atenção', 'Por favor selecione o registro o qual deseja espelhar.');
							        		}
							        		else
							        		{
							        			if(view.parent.getSelectionCount() > 1)
							        			{
							        				Ext.MessageBox.alert('Atenção', 'Por favor selecione apenas um registro.');
							        			}
							        			else
							        			{
													if(!Ext.isEmpty(view.parent.getSelectedNodes()[0].referencia_id))
													{
														Ext.MessageBox.alert('Atenção', 'Não possivel espelhar este registro porque trata-se de uma referência.');
													}
													else
													{
														var msgbox = Ext.MessageBox.wait('Espelhando registro ...', 'Aguarde');
														
														Ext.Ajax.request
															({
																url: _PHP_.url.copy + view.parent.getSelectedNodes()[0].id,
																method: 'post',
																callback: function(options, success, response)
																	{
																		msgbox.hide();
																		
																		var response = Ext.util.JSON.decode(response.responseText); 
																		if(response.success === 'true')
																		{
																			view.parent.store.reload();
																		}
																		else
																		{
																			msgbox.alert('Erro', response.erro);
																		}
																	}
															});
													}
												}
											} 	
				   						}
				   				}
							);
					},
				linkButton: function(view, idx, callback)
					{
						view.getTopToolbar().insertButton(idx, new Ext.Toolbar.Separator());
						view.getTopToolbar().insertButton
							(
								idx+1, 
								{
				   					xtype: 'tbbutton',
									text: 'Link',
				   					icon: _PHP_.url.incroot+'img/admin/ext/application_link.png',
							        cls: 'x-btn-text-icon',
				   					handler: function()
				   						{
				   							if(view.parent.getSelectionCount() < 1)
							        		{
							        			Ext.MessageBox.alert('Atenção', 'Por favor selecione o registro o qual deseja linkar.');
							        		}
							        		else
							        		{
							        			if(view.parent.getSelectionCount() > 1)
							        			{
							        				Ext.MessageBox.alert('Atenção', 'Por favor selecione apenas um registro.');
							        			}
							        			else
							        			{
													Ext.MessageBox.wait('Redirecionando ...', 'Aguarde');
													window.location.href = _PHP_.url.link + view.parent.getSelectedNodes()[0].id + (typeof callback === 'function' ? callback() : '');
							        			}
							        		}
				   						}
				   				}
							);
					}
			},
		id2Idioma: function(id)
			{
				switch(parseInt(id))
				{
					case 2:
						return 'espanhol';
						break;
					case 3:
						return 'ingles inglês';
						break;
					case 4:
						return 'portugues português';
						break;
				}
			},
		id2Flag: function(id)
			{
				switch(parseInt(id))
				{
					case 2:
						return 'es';
						break;
					case 3:
						return 'en';
						break;
					case 4:
						return 'pt';
						break;
				}
			},
		applyDefaults: function(object, defaults)
			{
				if(object._maxLength && object._maxLength != Number.MAX_VALUE)
				{
					var backup = {maxLength: object._maxLength};
				}
				Ext.apply(object, defaults);
				if(backup)
				{
					Ext.apply(object, backup);
				}
			},
		removeField : function(container, field)
			{
				if(field && field.el)
				{
					field.el.up('.x-form-item').remove();
					//container.remove(field);
					//container.doLayout();
				}
			},
		createImageField: function(params)
			{
				var field = 
					{
						image: false,
						fieldset: new Ext.form.FieldSet
							({
							    title: params.fieldset.label,
							    autoHeight: true,
							    defaultType: 'textfield',
							    collapsed: params.fieldset.collapsed,
								collapsible: (params.fieldset.collapsed ? true : false)
							}),
						setImage : function(params)
							{						    
								this.image = new Ext.form.MiscField
									({
										fieldLabel: params.label,
										listeners: 
											{
												'render': function()
													{
														var dc = '?_dc=' + (new Date().getTime());
														
														this.img = document.createElement('img');
														this.img.setAttribute('src', _PHP_.url.incroot+params.url.src+dc);
														this.img.setAttribute('width', params.image.width);
														this.img.setAttribute('height', params.image.height);
														this.img.setAttribute('alt', '');
														this.img.style.border = '0.1em solid #333333';
														
														this.img.configPopup = function(params)
															{
																if(params.image.realWidth > 0) 
																{
																	this.img.style.cursor = 'pointer';
																	this.markInvalid('Atenção: Imagem redimencionada, clique para abri-la no tamanho original');
																	
																	if(!this.img._onclick)
																	{
																		this.errorEl.setWidth(params.image.width);
																		this.img._onclick = function()
																			{
																				Ext.MessageBox.show(
																					{
																						title: params.label,
																						msg: '<img src="' + _PHP_.url.incroot+params.url.src+dc + '" alt="" />',
																						maxWidth: params.image.realWidth + 30,
																						minWidth: params.image.realWidth + 30,
																						buttons: Ext.Msg.OK
																					});
																			};
																	}
																	
																	Ext.EventManager.on(this.img, 'click', this.img._onclick);
																}
																else
																{
																	this.img.style.cursor = 'default';
																	this.clearInvalid();
																	if(this.img._onclick) Ext.EventManager.un(this.img, 'click', this.img._onclick);
																}
															};
														this.img.configPopup.apply(this, [params]);
														
														// TABLE
														var td = document.createElement('td');
														td.appendChild(this.img);
														
														var tr = document.createElement('tr');
														tr.appendChild(td);
														
														if(params.url.del) 
														{
															var button = document.createElement('img');
															button.setAttribute('src', _PHP_.url.imgroot + 'admin/ext/cross.png');
															button.setAttribute('alt', '');
															button.setAttribute('title', 'Apagar');
															button.style.cursor = 'pointer';
															Ext.EventManager.on(button, 'click', function()
																{
																	field.delImage(params.url.del, params.url.src);
																});
															
															td = document.createElement('td');
															td.style.verticalAlign = 'top';
															td.appendChild(button);
															tr.appendChild(td);
														}
														
														// IE MF FIX
														var tbody = document.createElement('tbody');
														tbody.appendChild(tr);
														
														var table = document.createElement('table');
														table.style.borderCollapse = 'collapse';
														table.appendChild(tbody);
														
														this.el.appendChild(table);
													}
											}
									});
								this.fieldset.add(this.image);
								this.fieldset.doLayout();
							},
							
						delImage : function(url, src)
							{
								if(url == undefined)
								{
									field.reset();
									this.image = false;
								}
								else 
								{
									var msgbox = Ext.MessageBox.wait('Processando ...', 'Aguarde');
									
									setTimeout(function()
									{
										Ext.Ajax.request
											({
												url: url,
												params:
													{
														src: src
													},
												method: 'post',
												
												callback: function(options, success, response)
												{
													msgbox.hide();
													
													var response = Ext.util.JSON.decode(response.responseText);
													//alert(action.response.responseText); return false;
													
													if (response.success === 'true') 
													{
														field.reset();
													}
													else 
													{
														Ext.MessageBox.alert('Erro', response.erro);
													}
												}
											});
									}, 1500);
								}
							},
							
						reset: function()
							{
								if(this.image) 
								{
									util.removeField(this.fieldset, this.image);
								}
							}
					};
				
				if(params.file)
				{
					field.fieldset.collapsible = true;
					if(params.file.vtype)
					{
						var vtypeId = Ext.id();
						Ext.form.VTypes['imageFilename_'+vtypeId] = function(value)
						{
							 var re = new RegExp(params.file.vtype.pattern, '\i');
							 return re.test(value);
						};
						Ext.form.VTypes['imageFilename_'+vtypeId+'Text'] = params.file.vtype.text;
					}
					//field.file = new Ext.form.FileUploadField
					field.file = new Ext.form.TextField
					    ({
							fieldLabel: params.file.label,
					        name: params.file.name,
							//width: params.file.width,
					        inputType: 'file',
					        vtype: (params.file.vtype) ? 'imageFilename_'+vtypeId : null,
							allowBlank: (params.file.allowBlank == false) ? false : true
					    });
					
					field.fieldset.add(field.file);
				}
				
				return field;
			},
		createFileField: function(params)
			{
				if(params.file.vtype)
				{
					var vtypeId = Ext.id();
					Ext.form.VTypes['fileFilename_'+vtypeId] = function(value)
						{
							 var re = new RegExp(params.file.vtype.pattern, '\i');
							 return re.test(value);
						};
					Ext.form.VTypes['fileFilename_'+vtypeId+'Text'] = params.file.vtype.text;
				}
				
				var field = 
					{
						msgbox: Ext.MessageBox,
						url: 
							{
								del: false,
								get: false
							},
						fieldset: new Ext.form.FieldSet
							({
							    title: params.fieldset.label,
							    autoHeight: true,
							    defaultType: 'textfield',
							    collapsed: params.fieldset.collapsed,
								collapsible: (params.fieldset.collapsed ? true : false)
							}),
						file: new Ext.form.TextField
						//file: new Ext.form.FileUploadField
					    	({
								fieldLabel: params.file.label,
						        name: params.file.name,
								//width: params.file.width,
						        inputType: 'file',
						        vtype: (params.file.vtype) ? 'fileFilename_'+vtypeId : null,
								allowBlank: (params.file.allowBlank == false) ? false : true,
								listeners:
									{
										'render': function(file)
											{
												var span = document.createElement('span');
												span.style.paddingLeft = '10px';
												var dl_bt = document.createElement('img');
												dl_bt.setAttribute('src', _PHP_.url.imgroot+'admin/ext/disk.png');
												dl_bt.setAttribute('alt', '');
												dl_bt.setAttribute('title', 'Download');
												dl_bt.style.cursor = 'pointer';
												Ext.EventManager.on(dl_bt, 'click', field.download);
												span.appendChild(dl_bt);
												
												file.el.parent().appendChild(span);
												
												var del_bt = document.createElement('img');
												del_bt.setAttribute('src', _PHP_.url.imgroot+'admin/ext/cross.png');
												del_bt.setAttribute('alt', '');
												del_bt.setAttribute('title', 'Apagar');
												del_bt.style.cursor = 'pointer';
												del_bt.style.paddingLeft = '10px';
												Ext.EventManager.on(del_bt, 'click', field.del);
												span.appendChild(del_bt);	
												
												var iframe = document.createElement('iframe');
												iframe.style.display = 'none';
												span.appendChild(iframe);
												
												field.span = new Ext.Element(span);
												field.iframe = iframe;
												field.dl_bt = new Ext.Element(dl_bt);
												field.del_bt = new Ext.Element(del_bt);
												
												field.span.hide();
												file.el.parent().appendChild(span);
											}
									}
						    }),
						setFile: function(url)
							{						    
								this.url = url;
								
								if(this.url.get && this.url.del)
								{
									this.del_bt.show();
								}
								else
								{
									this.del_bt.hide();
								}
								this.span.show();
							},
						download: function()
							{
								field.iframe.src = field.url.get + field.url.params;
							},
						del: function(hideOnly)
							{
								if(hideOnly === true)
								{
									this.url =
										{
											del: false,
											get: false
										};
									this.span.hide();
									this.del_bt.hide();
								}
								else 
								{
									field.msgbox.wait('Processando ...', 'Aguarde');
									
									setTimeout(function()
										{
											Ext.Ajax.request
												({
													url: field.url.del,
													params:
														{
															src: field.url.src
														},
													method: 'POST',
													
													callback: function(options, success, response)
													{
														field.msgbox.hide();
														
														var response = Ext.util.JSON.decode(response.responseText);
														//alert(action.response.responseText); return false;
														
														if (response.success === 'true') 
														{
															field.span.hide();
															field.del_bt.hide();
														}
														else 
														{
															Ext.MessageBox.alert('Erro', response.erro);
														}
													}
												});
										}, 1500);
								}
							}
					};
				field.fieldset.add(field.file);
				
				return field;
			}
	};